home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Merciful 5
/
Merciful - Disc 5.iso
/
software
/
p
/
pcqpascalv1.2d.lha
/
Examples2
/
Splitter
/
splitter.p
Wrap
Text File
|
1997-05-06
|
3KB
|
143 lines
program splitter;
{
*****
Quickhack, um eine große Datei in mehrere kleine
*****
*****
aufzuspalten. (C) 1993 by B. Künnen
*****
}
{$I "Include:libraries/dos.i" }
{$I "Include:utils/stringlib.i" }
{$I "Include:exec/memory.i" }
Const
bufsize = 64*1024; { Größe des IO-Puffers }
VAR
ok : Boolean;
mymem : Address;
inFile : String;
i,
num_files : Integer;
len : Array[1..10] of Integer;
inhdl,
outhdl : FileHandle;
Procedure CleanExit(why : String; rt : Integer);
Begin
If inhdl <> NIL then DosClose( inhdl );
If outhdl <> NIL then DosClose( outhdl );
If mymem <> NIL then FreeMem( mymem, bufsize );
If why <> NIL then write(why);
Exit(rt);
End;
{ Einlesen & Ausgabe der Daten }
Function SplitIO( num : Integer ): Boolean;
Var
r,w,
rwlen,
outlen : Integer;
buffer : array[0..100] of Char;
NewName : String;
buflen : integer;
Begin
NewName := Adr( buffer );
strcpy( NewName, inFile );
{ Name der Ausgabedatei = Eingabedatei+Nummer }
buflen := strlen( NewName );
NewName[buflen] := chr( Byte('0') + num );
NewName[buflen+1] := chr(0);
{ Öffnen }
outhdl := DosOpen( NewName, Mode_NewFile );
If outhdl=NIL then SplitIO:=FALSE;
{ Länge dieser neuen Datei }
Write("Länge der ", num, ". Datei : ");
readln(outlen);
write("Moment...\n");
{ Jetzt in bufsize -großen Stücken umschaufeln }
REPEAT
if outlen>bufsize then
rwlen := bufsize
else
rwlen := outlen;
r := DosRead ( inhdl, mymem, rwlen );
w := DosWrite( outhdl, mymem, r );
If r < rwlen then begin
write("Dateiende erreicht - Programmabbruch\n");
DosClose(outhdl);
outhdl := NIL;
SplitIO := FALSE;
End;
If w < r then begin
Write("Fehler bei der Ausgabe in die Ziel Datei ", NewName, "\n" );
DosClose( outhdl );
SplitIO := FALSE;
End;
If outlen > bufsize then
outlen := outlen-bufsize
else
outlen := 0;
UNTIL outlen=0;
{ Uuuuuuuuuuuuuuuuuuuuuuuuuuuuunnnd ..... tschüß ! }
DosClose( outhdl );
SplitIO := TRUE;
End;
{ ---- Hauptschleife ---- }
Begin
inFile := AllocString(100);
write("Welche Datei soll zerlegt werden ? : ");
Readln(inFile);
If inFile^=chr(0) then CleanExit("Kein Dateiname angegeben.\n", 0);
inhdl := DosOpen( inFile, Mode_OldFile );
If inhdl=NIL then CleanExit("Kann Datei nicht öffnen.\n", 10);
mymem := AllocMem( bufsize, Memf_Public );
If mymem = NIL then CleanExit("Zu wenig Speicher", 20);
write("In wieviele Einzeldateien soll sie zerlegt werden ? : ");
Readln(num_files);
If (num_files>10) OR (num_files<1)
then CleanExit("Min.1 & max. 10 Split-Dateien erlaubt.\n", 0);
{ Jetzt gehts los ... }
for i := 1 to num_files do begin
ok := SplitIO( i );
If OK = False then CleanExit(NIL,0);
end;
CleanExit(NIL,0);
End.